import pluginJs from '@eslint/js';
import importPlugin from 'eslint-plugin-import';
import prettier from 'eslint-plugin-prettier';
import globals from 'globals';
import tseslint from 'typescript-eslint';

export default [
  {
    ignores: ['node_modules', 'dist', 'public', 'env', 'config'],
  },
  {
    files: ['**/*.{js,mjs,cjs}'],
    languageOptions: { globals: globals.node, ecmaVersion: 'latest' },
  },
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  importPlugin.flatConfigs.recommended,
  {
    settings: {
      'import/resolver': {
        typescript: {
          project: './tsconfig.json',
        },
      },
    },
    plugins: {
      prettier: prettier,
    },
    rules: {
      'import/order': [
        'error',
        {
          // 对导入模块进行分组
          groups: [
            'builtin',
            'external',
            ['internal', 'parent', 'sibling', 'index', 'object', 'type'],
            'unknown',
          ],
          // 通过路径自定义分组
          pathGroups: [
            {
              // pattern：当前组中模块的最短路径匹配
              pattern: '@/**', // 在规定的组中选其一，index、sibling、parent、internal、external、builtin、object、type、unknown
              group: 'external',
              // 定义组的位置，after、before
              position: 'after',
            },
          ],
          pathGroupsExcludedImportTypes: ['builtin'],
          // newlines-between 不同组之间是否进行换行
          'newlines-between': 'always',
          // alphabetize 根据字母顺序对每个组内的顺序进行排序
          alphabetize: {
            order: 'asc',
            caseInsensitive: true,
          },
        },
      ],
      // 删除这行，因为它是 TypeScript 特定的规则
      // 'no-require-imports': 'warn',
      'import/no-unresolved': ['error', { commonjs: true }],
      'prettier/prettier': 'warn',
      'no-console': 'off',
      'no-restricted-globals': 'off',
      'no-restricted-syntax': 'off',
      'no-multiple-empty-lines': ['warn', { max: 1 }],
      // 仅针对局部变量未使用报错
      'no-unused-vars': [
        'error',
        {
          argsIgnorePattern: '^_', // 忽略以 "_" 开头的参数
          varsIgnorePattern: '^_', // 忽略以 "_" 开头的变量
          ignoreRestSiblings: true, // 忽略剩余参数的兄弟节点
          caughtErrors: 'all', // 处理 catch 子句中的错误
          args: 'none', // 不检查函数参数，这会包括类型定义中的参数
        },
      ],
      // 检测无用的赋值行为
      'no-useless-assignment': 'error',
      // 允许短路表达式
      'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }],
      // 禁止异步 Promise 执行器功能，即不允许promise嵌套async
      'no-async-promise-executor': 'error',
      // 禁止不必要的转义字符。
      'no-useless-escape': 'warn',
      // 鼓励声明变量时优先使用 const
      'prefer-const': [
        'error',
        {
          // 只对未重新赋值的解构赋值应用 prefer-const 规则
          destructuring: 'all',
          ignoreReadBeforeAssign: true,
        },
      ],
    },
  },
  {
    files: ['**/*.ts'],
    rules: {
      '@typescript-eslint/no-unused-vars': [
        'error',
        {
          argsIgnorePattern: '^_', // 忽略以 "_" 开头的参数
          varsIgnorePattern: '^_', // 忽略以 "_" 开头的变量
          ignoreRestSiblings: true, // 忽略剩余参数的兄弟节点
          caughtErrors: 'all', // 处理 catch 子句中的错误
          args: 'none', // 不检查函数参数，这会包括类型定义中的参数
        },
      ],
      // 允许短路表达式
      '@typescript-eslint/no-unused-expressions': ['error', { allowShortCircuit: true }],
      // 禁止显式使用 any 类型
      '@typescript-eslint/no-explicit-any': 'off',
      // 禁止定义空函数
      '@typescript-eslint/no-empty-function': 'warn',
      // 禁止对 this 进行赋值
      '@typescript-eslint/no-this-alias': 'warn',
      // 禁止使用特定的 TypeScript 注释（如 // @ts-ignore）。
      '@typescript-eslint/ban-ts-comment': 'warn',
      // 禁止使用 require 导入模块。
      '@typescript-eslint/no-require-imports': 'warn', // 这里已经正确配置了
    },
  },
];
